class EventEmitter {
  constructor() {
    this.eventObjArr = {};
  }
  // 绑定事件的方法
  // on可以绑定多个事件
  on(eventName, fn) {
    // 通过数组 把 多个函数 保持起来
    // myevnet1: [fn1,fn2,fn3]
    // myevnet2 :[fn1,fn2]
    // myevent3 :[fn1,fn2,fn3,fn4]
    /* 
            eventObjArr = {myevent1:[fn,fn2,fn3],myevnet2:[fn1,fn2],myevnet3:[fn1,fn2]}
        */
    // 如果第一次使用on方法绑定事件 那么初始化一个数组出来
    // eventObjArr = {myevent1:[]}
    if (typeof this.eventObjArr[eventName] === "undefined") {
      // 第一次绑定事件 ，初始化对象里的数组
      this.eventObjArr[eventName] = [];
    }
    // 把事件函数加入到 对象的数组里；
    this.eventObjArr[eventName].push(fn);
  }
  emit(eventName, ...args) {
    // 需要调用之前保存的函数
    /* 
            eventObjArr = {myevent1:[fn1,fn2],myevent2:[fn1]};
        */
    console.log("??", this.eventObjArr);
    this.eventObjArr[eventName].forEach((fn) => {
      fn(...args);
    });
  }

  off(eventName, fn) {
    // eventObjArr = {myevent1:[fn1,fn2],myevent2:[fn1]};
    this.eventObjArr[eventName].forEach((itemFn, key) => {
      if (itemFn === fn) {
        // 删除数组里的这个函数；
        this.eventObjArr[eventName].splice(key, 1);
      }
    });
  }
  listenCount(eventName) {
    if (typeof this.eventObjArr[eventName] === "undefined") {
      return 0;
    } else {
      return this.eventObjArr[eventName].length;
    }
  }
}

module.exports = EventEmitter;
// let eventObj = new EventEmitter();
// eventObj.on("myevent1", function (res) {
//     console.log(111,res);
// })
// let fn2 = function (res) {
//     console.log(222,res);
// }
// eventObj.on("myevent1", fn2);
// eventObj.on("myevent2", function (res) {
//     console.log(3333,res);
// })
// // eventObj.off("myevent1",fn2);

// eventObj.emit("myevent1", "hello")
// console.log(eventObj);

// 实现 ： listenCount 方法 和 removeAllListeners ，once 实现；
